module id_ex_reg(
    input  wire        clk,         // 时钟：上升沿触发
    input  wire        rstn,        // 同步复位（低有效）：拉低时清零所有输出寄存器
    // ---------- 来自 ID 阶段（本拍产生） ----------
    input  wire [31:0] id_rdata1,   // 从寄存器堆读到的 rs1 值（ALU 的 A 操作数）
    input  wire [31:0] id_rdata2,   // 从寄存器堆读到的 rs2 值（R 型时作为 ALU 的 B 操作数）
    input  wire [31:0] id_imm,      // I 型指令的有符号扩展立即数（ADDI 用作 ALU 的 B 操作数）
    input  wire [4:0]  id_rd,       // 目的寄存器编号（写回目标寄存器）
    input  wire        id_regwrite, // 写回使能（来自 controller），1 表示本指令将在 WB 写寄存器
    input  wire        id_alusrc,   // ALU 第二操作数选择：1=使用立即数（I 型），0=使用 rs2（R 型）
    input  wire [3:0]  id_alu_ctrl, // ALU 功能码：0000=ADD, 0001=SUB（与 alu.v 对应）

    // ---------- 输出到 EX 阶段（下一拍被使用） ----------
    output reg  [31:0] ex_rdata1,   // 打拍后的 rs1 值 → ALU A
    output reg  [31:0] ex_rdata2,   // 打拍后的 rs2 值 → ALU B（当 ex_alusrc=0）
    output reg  [31:0] ex_imm,      // 打拍后的 I 型立即数 → ALU B（当 ex_alusrc=1）
    output reg  [4:0]  ex_rd,       // 打拍后的目的寄存器号 → 后续 EX/MEM、MEM/WB 直至写回
    output reg         ex_regwrite, // 打拍后的写回使能 → 贯穿至 WB 阶段控制寄存器写使能
    output reg         ex_alusrc,   // 打拍后的 B 源选择 → EX 阶段选择 ALU 的第二操作数
    output reg  [3:0]  ex_alu_ctrl  // 打拍后的 ALU 功能码 → EX 阶段选择具体运算
);

    // 时序逻辑：同步复位清零；否则把 ID 阶段的信号在时钟上升沿锁存到 EX 输出
    always @(posedge clk) begin
        if (!rstn) begin
            ex_rdata1   <= 32'b0;
            ex_rdata2   <= 32'b0;
            ex_imm      <= 32'b0;
            ex_rd       <= 5'b0;
            ex_regwrite <= 1'b0;
            ex_alusrc   <= 1'b0;
            ex_alu_ctrl <= 4'b0;
        end else begin
            ex_rdata1   <= id_rdata1;
            ex_rdata2   <= id_rdata2;
            ex_imm      <= id_imm;
            ex_rd       <= id_rd;
            ex_regwrite <= id_regwrite;
            ex_alusrc   <= id_alusrc;
            ex_alu_ctrl <= id_alu_ctrl;
        end
    end
endmodule
